#include <string>
#include <functional>

using namespace std;

template <typename T> int compare(const T& v1, const T& v2) {
    if (less<T>()(v1, v2)) return -1;
    if (less<T>()(v2, v1)) return 1;
    return 0;
}

template <typename T> void func(decltype(compare<T>)*) { /* ... */ }

// func 的重载版本；每个版本接受一个不同的函数指针类型
void func(int(*)(const string&, const string&)) { /* ... */ }
void func(int(*)(const int&, const int&)) { /* ... */ }

int main()
{
    // pf1 指向实例 int compare(const int&, const int&)
    int (*pf1)(const int&, const int&) = compare;

    // func(compare); // 错误：使用 compare 的哪个实例？

    // 正确：显式指出实例化哪个 compare 版本
    func(compare<int>); // 传递 compare(const int&, const int&)
}